package com.atguigu.yygh.common.exception;

import com.atguigu.yygh.common.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Author 孔德成
 * @Slogan 致敬大师，致敬未来的你
 * @date 2021/8/28
 * @desc 使用控制器通知，处理所有控制器中处理器方法所抛出的异常
 * 控制器通知(controller advice)是任意带有 @ControllerAdvice 注解的类，
 * 这个类会包含一个或多个如下类型的方法:
 * 1. @ExceptionHandler注解标注的方法;
 * 2. @InitBinder注解标注的方法;
 * 3. @ModelAttribute注解标注的方法。
 * 在带有 @ControllerAdvice 注解的类中，以上所述的这些方法会运用到整个应用程序所有控制器中带有@RequestMapping注解的方法上。
 * 控制器通知最为实用的一个场景就是将所有的 @ExceptionHandler方法收集到一个类中，这样所有控制器的异常就能在一个地方进行一致的处理
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * Exception 异常处理方法
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e) {
        log.error(e.getMessage());
        return R.error().message(e.getMessage());
    }

    /**
     * YyghException 异常处理方法
     */
    @ExceptionHandler(YyghException.class)
    @ResponseBody
    public R error(YyghException e) {
        log.error(e.getMsg());
        return R.error(e.getCode(),e.getMsg());
    }

}
